/*!
 * \file WtHelper.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief UFT助手工具类定义文件
 * 
 * \details 该文件定义了WtHelper工具类，提供了一系列静态方法用于：
 *          - 路径管理和目录操作
 *          - 时间日期状态管理
 *          - 系统配置目录访问
 *          - UFT模块实例目录管理
 *          这是UFT系统中的核心工具类，为其他模块提供基础服务支持
 */
#pragma once
#include <string>
#include <stdint.h>

/*!
 * \class WtHelper
 * \brief UFT助手工具类
 * 
 * \details 该类提供了一系列静态工具方法，用于UFT系统的基础服务：
 *          - 获取当前工作目录和模块路径
 *          - 管理策略数据、用户数据、组合数据等各种目录
 *          - 维护系统当前时间状态（日期、时间、秒数、交易日）
 *          - 管理实例目录和生成文件目录配置
 * 
 * \note 该类采用静态方法设计，无需实例化即可使用
 *       所有时间相关的状态都是全局共享的
 */
class WtHelper
{
public:
	/*!
	 * \brief 获取当前工作目录
	 * \return 返回标准化的当前工作目录路径
	 * \details 该方法会缓存第一次获取的结果，后续调用直接返回缓存值
	 *          路径会被自动标准化处理
	 */
	static std::string getCWD();

	/*!
	 * \brief 获取模块路径
	 * \param moduleName 模块名称
	 * \param subDir 子目录名称
	 * \param isCWD 是否基于当前工作目录，默认为true
	 * \return 返回完整的模块路径
	 * \details 根据指定的模块名和子目录，构建完整的模块路径
	 *          可以选择基于当前工作目录或实例目录
	 */
	static std::string getModulePath(const char* moduleName, const char* subDir, bool isCWD = true);

	/*!
	 * \brief 获取基础目录
	 * \return 返回基础生成目录路径
	 * \details 返回系统生成文件的基础目录，如果目录不存在会自动创建
	 */
	static const char* getBaseDir();
	
	/*!
	 * \brief 获取输出目录
	 * \return 返回输出文件目录路径
	 * \details 返回系统输出文件的目录，用于存储日志、报告等输出文件
	 *          如果目录不存在会自动创建
	 */
	static const char* getOutputDir();
	
	/*!
	 * \brief 获取策略数据目录
	 * \return 返回策略数据目录路径
	 * \details 返回策略运行时数据存储目录，用于存储策略的运行时状态数据
	 *          如果目录不存在会自动创建
	 */
	static const char* getStraDataDir();
	
	/*!
	 * \brief 获取策略用户数据目录
	 * \return 返回策略用户数据目录路径
	 * \details 返回策略用户自定义数据存储目录，用于存储用户配置和数据
	 *          如果目录不存在会自动创建
	 */
	static const char* getStraUsrDatDir();

	/*!
	 * \brief 获取组合目录
	 * \return 返回组合数据目录路径
	 * \details 返回投资组合数据存储目录，用于存储组合配置和状态信息
	 *          如果目录不存在会自动创建
	 */
	static const char* getPortifolioDir();

	/*!
	 * \brief 设置当前时间
	 * \param date 当前日期（格式：YYYYMMDD）
	 * \param time 当前时间（格式：HHMMSS，以分钟为准）
	 * \param secs 当前秒数（额外精度，默认为0）
	 * \details 设置系统当前的时间状态，用于UFT系统的统一时间管理
	 *          时间格式采用整数表示，便于计算和比较
	 */
	static inline void setTime(uint32_t date, uint32_t time, uint32_t secs = 0)
	{
		_cur_date = date;
		_cur_time = time;
		_cur_secs = secs;
	}

	/*!
	 * \brief 设置交易日期
	 * \param tDate 交易日期（格式：YYYYMMDD）
	 * \details 设置当前交易日，交易日可能与自然日期不同（如夜盘）
	 */
	static inline void setTDate(uint32_t tDate){ _cur_tdate = tDate; }

	/*!
	 * \brief 获取当前日期
	 * \return 返回当前日期（格式：YYYYMMDD）
	 */
	static inline uint32_t getDate(){ return _cur_date; }
	
	/*!
	 * \brief 获取当前时间
	 * \return 返回当前时间（格式：HHMMSS）
	 */
	static inline uint32_t getTime(){ return _cur_time; }
	
	/*!
	 * \brief 获取当前秒数
	 * \return 返回当前秒数（额外精度）
	 */
	static inline uint32_t getSecs(){ return _cur_secs; }
	
	/*!
	 * \brief 获取交易日期
	 * \return 返回当前交易日期（格式：YYYYMMDD）
	 */
	static inline uint32_t getTradingDate(){ return _cur_tdate; }

	/*!
	 * \brief 获取实例目录
	 * \return 返回实例目录路径的引用
	 * \details 返回UFT实例的安装目录路径
	 */
	static const std::string& getInstDir() { return _inst_dir; }
	
	/*!
	 * \brief 设置实例目录
	 * \param inst_dir 实例目录路径
	 * \details 设置UFT实例的安装目录路径
	 */
	static void setInstDir(const char* inst_dir){ _inst_dir = inst_dir; }

	/*!
	 * \brief 设置生成目录
	 * \param gen_dir 生成文件目录路径
	 * \details 设置系统生成文件的基础目录路径
	 */
	static void setGenerateDir(const char* gen_dir) { _gen_dir = gen_dir; }

private:
	static uint32_t		_cur_date;	//!< 当前日期（格式：YYYYMMDD）
	static uint32_t		_cur_time;	//!< 当前时间（格式：HHMMSS，以分钟为准）
	static uint32_t		_cur_secs;	//!< 当前秒数（额外精度）
	static uint32_t		_cur_tdate;	//!< 当前交易日期（格式：YYYYMMDD）
	static std::string	_inst_dir;	//!< 实例安装目录路径
	static std::string	_gen_dir;	//!< 生成文件基础目录路径
};

